package pms.dao;

import java.util.ArrayList;
import java.util.List;
import java.util.Set;

import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import pms.om.Kategorie;
import pms.om.Musikstueck;
import pms.om.Stimme;


public class KategorieDao extends HibernateDaoSupport{
	private MusikstueckDao musikstueckDao;

	/** Getter
	 * @return the musikstückDao
	 */
	public MusikstueckDao getMusikstueckDao() {
		return musikstueckDao;
	}

	/** Setter
	 * @param musikstueckDao the musikstueckDao to set
	 */
	public void setMusikstueckDao(MusikstueckDao musikstueckDao) {
		this.musikstueckDao = musikstueckDao;
	}

	/** findById
	 * @param id
	 * @return the Kategorie
	 */
	public Kategorie findById (int id) {
		HibernateTemplate template = getHibernateTemplate();
		return (Kategorie) template.get(Kategorie.class, id);
	}
	
	/** findMusikstueckeByKategorieId
	 * @param id
	 * @return the foundMusikstuecke
	 */
	@SuppressWarnings("unchecked")
	public List<Musikstueck> findMusikstueckeByKategorieId(int id) {
		HibernateTemplate template = getHibernateTemplate();
		List<Musikstueck> alleMusikstuecke = template.loadAll(Musikstueck.class);
		List<Musikstueck> foundMusikstuecke = new ArrayList<Musikstueck>();
		for (Musikstueck musikstueck : alleMusikstuecke) {
			if (musikstueck.getKategorie().getId() == id) {
				foundMusikstuecke.add(musikstueck);
			}
		}
		return foundMusikstuecke;
	}
	
	/** findAll
	 * @return the results
	 */
	@SuppressWarnings("unchecked")
	public List<Kategorie> findAll() {
		HibernateTemplate template = getHibernateTemplate();
		List<Kategorie> results = template.loadAll(Kategorie.class);
		return results;
	}
	
	/** create
	 * @param kategoriebezeichnung
	 */
	public void create(String kategoriebezeichnung) {
		HibernateTemplate template = getHibernateTemplate();
		Kategorie k = new Kategorie(kategoriebezeichnung);
		template.persist(k);
	}
	
	/** modify
	 * @param id
	 * @param kategoriebezeichnung
	 */
	public void modify(int id, String kategoriebezeichnung) {
		HibernateTemplate template = getHibernateTemplate();
		Kategorie k = (Kategorie) template.get(Kategorie.class, id);
		k.setKategoriebezeichnung(kategoriebezeichnung);
		template.saveOrUpdate(k);
	}
	
	/** deleteById
	 * @param id
	 * @throws Exception
	 */
	public void deleteById(int id)throws Exception {
		HibernateTemplate template = getHibernateTemplate();
		Kategorie k = findById(id);
		List<Musikstueck> musikstuecke = findMusikstueckeByKategorieId(k.getId());
				
		if (musikstuecke == null || musikstuecke.size() == 0) {
			template.delete(k);
		} else {
			throw new KategorieDeleteExeption();
		}
		template.flush();
	}
}
